package com.open.capacity.reptile.util;

import org.apache.commons.codec.binary.Base64;

import java.io.*;

public class Base64Utils {

    public static String encodeBase64File(String prefix, File file) {
        try {
            if (file == null || !file.exists() || prefix == null) {
                return null;
            }
            long beginTime = System.currentTimeMillis();
            // base64文件前缀
            String base64Format = Base64FileTypeEnum.value(prefix.toLowerCase());
            if (base64Format == null || "".equals(base64Format)) {
                return null;
            }

            // 获取文件流
            InputStream in = new FileInputStream(file);
            BufferedInputStream bufInput = new BufferedInputStream(in); // 缓存流

            // 先把二进制流写入到ByteArrayOutputStream中
            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
            byte[] bt = new byte[4096];
            int len;
            while ((len = bufInput.read(bt)) != -1) {
                byteArray.write(bt, 0, len);
            }
            byteArray.flush();

            long endTime = System.currentTimeMillis();
            System.out.println("==>encodeBase64File, 把文件转换成base64编码, 总耗时: " + (endTime - beginTime) + "ms");

            // 返回
            return base64Format + Base64.encodeBase64String(byteArray.toByteArray());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 把base64文件解码
    public static String decodeBase64String(String prefix, String base64String) {
        try {
            if (prefix == null || base64String == null) {
                return null;
            }
            long beginTime = System.currentTimeMillis();

            // 把base64前缀截取掉
            // base64文件前缀
            String value = Base64FileTypeEnum.value(prefix.toLowerCase());
            if (value == null || "".equals(value)) {
                return null;
            }
            // 替换
            String tempBase64String = base64String.replace(value, "");

            // 把base64字符串转换成字节
            byte[] bytes = Base64.decodeBase64(tempBase64String);

            // 转换成字节输入流
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);

            // 把base64编码文件还原, 并存放到指定磁盘路径中
            OutputStream out = new FileOutputStream(new File("D:\\new_test." + prefix));

            // 写文件
            byte[] buffer = new byte[4096];
            int len = 0;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len); // 文件写操作
            }

            long endTime = System.currentTimeMillis();
            System.out.println("==>decodeBase64String, 解析base64编码文件, 总耗时: " + (endTime - beginTime) + "ms");
            return "success";
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        // 获取文件, 对文件base64编码
//        File file = new File("D:\\test.txt");
        String prefix = "octet-stream";
//
//        // base64文件内容
//        String base64String = Base64Utils.encodeBase64File(prefix, file);
//        System.out.println("文件base64加密之后的内容(太长, 控制台可能打印不出来): \n" + base64String);

        // 获取base64文件, 进行解码
        Base64Utils.decodeBase64String(prefix, "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");
    }

}
